package br.com.sis.rh.facade;

import java.lang.reflect.Type;
import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import br.com.sis.rh.dao.DaoLocator;
import br.com.sis.rh.dao.GenericDAO;

@Transactional
public class GenericFacadeImpl<T, T_DAO extends GenericDAO<T>> implements GenericFacade<T> {

	@Autowired
	private DaoLocator daoLocatorFactoryBean;
	
	private T_DAO dao;
	
	private Class<T_DAO> tipo;
	
	public GenericFacadeImpl(Class<T_DAO> classe) {
		tipo = classe;
	}
	
	@SuppressWarnings("unchecked")
	@PostConstruct
	protected void autowireDao() {
		final Type type;
		type = tipo;
		
		final String typeClass = type.toString().concat("Impl");
		
		String daoName = typeClass.substring(typeClass.lastIndexOf('.')+1,typeClass.length());

		daoName = Character.toLowerCase(daoName.charAt(0)) + daoName.substring(1);
		
		this.dao = (T_DAO) daoLocatorFactoryBean.lookup(daoName);
	}

	
	@Override
	public void incluir(T objeto) {
		dao.incluir(objeto);
	}

	@Override
	public void alterar(T objeto) {
		dao.alterar(objeto);
	}
	
	@Override
	public void excluir(T objeto) {
		dao.excluir(objeto);
	}
	
	@Override
	public List<T> listar(T objeto) {
		return dao.listar(objeto);
	}

	@Override
	public T recuperarObjetoPorID(T objeto) {
		return dao.recuperarObjetoPorID(objeto);
	}
}
